import pandas as pd
# 3.数据清洗
# 3.1 删除冗余特征
# 3.1.1 删除缺失值
# 不存在缺失值，不需要处理
total = pd.read_csv(r'./data/total.csv')
total_copy = total.copy()
# total_isnull = total_copy.isnull().sum() # 缺失值统计
# data_count = total_copy.isnull().count() # 每列个数
# isnulldf = pd.DataFrame({'缺失值个数':total_isnull,'数据总数':data_count})
# # 缺失值百分比
# isnulldf['缺失值百分比'] = isnulldf['缺失值个数'] / isnulldf['数据总数']
# isnulldf = isnulldf.sort_values('缺失值百分比',ascending = False)
# print(isnulldf)

# 3.1.2 处理负值
# 在前期的EDA分析中，我们发现部分特征存在不合理的负值，需要进行一定处理；
# 前期EDA分析找到的存在“负值”的特征
list1 = ['当前设备使用天数','当前手机价格','过去六个月的平均每月使用分钟数','过去六个月的平均每月通话次数','过去六个月的平均月费用','家庭成人人数','每月平均使用分钟数','平均超额费用','平均超额使用分钟数','平均漫游呼叫数','平均语音费用','平均月费用','数据超载的平均费用']
# 当前dataframe的特征
col_list = list(total_copy.columns)
# 两者的交集
intersection_list = [x for x in list1 if x in col_list]
print(intersection_list)

# 定义一个替换函数
def negative_replace(x):
    if x < 0:
        return 0
    elif x >= 0:
        return x
# 遍历前面的交集列表
for i in intersection_list:
    total_copy[i] = total_copy[i].map(negative_replace)
    print(f'{i}处理成功~')

# 3.1.3 处理离散值
# 在前面了解数据分布的时候，我们会发现很多特征会拥有一些异常的离散值，这些离散值对我们的预测是不太有利的，我们需要对其进行处理。
# 我们通过使用“四分位数范围（IQR）法”去检测到异常值，数值其范围超过-1.5 x IQR至1.5 x IQR被视为离群值。
# 定义IQR检测离群值方法
def iqr_outliers(df):
    q1 = df.quantile(0.25)
    q3 = df.quantile(0.75)
    iqr = q3 - q1
    lower_tail = int(q1 - 1.5 * iqr)
    upper_tail = int(q3 + 1.5 * iqr)
    df = df.map(lambda x: lower_tail if x <lower_tail else upper_tail if x > upper_tail else x)
    return df
# 因为有些特征是离散型特征，无需经过上述这样处理，需要注意一下~
# 离散型特征
disperse_feature = ['客户ID', '地理区域', '信用等级代码', '新手机用户', '家庭活跃用户数', '在职总月数', '信用卡指示器','预计收入','信息库匹配','家庭成人人数','婚姻状况','手机网络功能','是否双频','是否翻新机','账户消费限额']
for i in total_copy.columns:
    # if i not in disperse_feature:
    total_copy[i] = total_copy[i].astype(int)
    total_copy[i] = iqr_outliers(total_copy[i])
print('处理成功~')

#该数据集没有重复值需要处理，所以到此，数据清洗就基本完成啦~

total_copy.to_csv(r'./data/数据清洗/total_copy包含多重共线特征.csv',index = False,encoding = 'utf-8')
